#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include<stdlib.h>

typedef void (*func_t)();
#define NUM 5
func_t handlers[NUM+1];

void DownLoad()
{
    printf("这是一个下载任务!\n");
}

void Plush()
{
    printf("这是一个刷新任务!\n");
}

void Log()
{
    printf("这是一个记录日志任务!\n");
}


void RegisterHandle(func_t h[],func_t f)
{
    int i = 0;
    for(;i<NUM;i++)
    {
        if(h[i]==NULL) break;
    }

    if(i==NUM) return;
    h[i]=f;
    h[i+1] = NULL;
}

int main()
{
    RegisterHandle(handlers,DownLoad);

    RegisterHandle(handlers,Plush);
    RegisterHandle(handlers,Log);
    //非阻塞轮渡
    pid_t id = fork();


    if(id==0)
    {
        //child
        while(1)
        {
            sleep(3);
            printf("This is child process,my id is%d,my parent id is %d\n",getpid(),getppid());
          //  int *p = 0;
          //  *p = 10;
         // int a = 10;
         // a/=0;
        }

        exit(10);
    }
    else
    {
        //parent
        while(1)
        {
            int status = 0;
            pid_t rid  = waitpid(id,&status,WNOHANG);

            if(rid>0)
            {
                printf("wait success!,rid:%d,exitcode:%d,exit signal:%d\n",rid,WEXITSTATUS(status),status&0x7F);
                break;
            }
            else if(rid==0)
            {
                //函数指针进行回调处理
                int i = 0;
                for(;handlers[i];i++)
                {
                    handlers[i]();
                }

                printf("本轮调用结束，子进程没有退出!\n");
                sleep(1);

            }
            else
            {
                printf("等待失败!\n");
                break;
            }
        }
    }
    //waitpid

  //  pid_t id = fork();


  //  if(id==0)
  //  {
  //      //child
  //      printf("This is child process,my id is%d,my parent id is %d\n",getpid(),getppid());
  // 
  //      sleep(10);

  //      exit(1);
  //  }
  //  else
  //  {
  //      //parent
  //       int statue = 0;
  //       pid_t rid = waitpid(id,&statue,0);
  //       if(rid>0)
  //       {
  //           if(WIFEXITED(statue))
  //           {
  //               printf("wait success!,rid:%d,exitcode:%d,exit signal:%d\n",rid,WEXITSTATUS(statue),statue&0x7F);
  //           }
  //           else
  //           {
  //               printf("子进程退出异常！\n");
  //           }
  //       }
  //  }

  //wait

  //  pid_t pid = fork();
  //  if(pid==0)
  //  {
  //      //child
  //      printf("I am a child pprocess!\n");
  //      sleep(10);
  //     // exit(1);
  //  }
  //  else
  //  {
  //      printf("I am a parent process!\n");
  //      //int status = 0;
  //      wait(NULL);

  //      printf("parent process end!\n");

  //  }
    return 0;
}
